#include "app/ApplicationConfig.h"
#include "app/Application.h"
#include "util/exceptions/Exception.h"
#include "util/logger/Logger.h"
#include "util/logger/LoggerManager.h"
#include "util/Dictionary.h"

util::LinkedList<std::string> getParameters(int argumentsCount, char **userArgments);

int main(int argc, char **argv) {

	// se recopilan los parametros (de std input o de archivo).
	util::LinkedList<std::string> params = getParameters(argc - 1, argv);

	try {
		// se crea la aplicacion con los parametros leidos
		// TODO: Para mi se deberian pasar los parametros al crear la aplicacion.
		// y que ella se encargue de validarlos.
		app::Application app(params);

		// se ejecuta la aplicacion
		app.run();
	} catch (util::Exception &e) {
		util::Logger* logger = util::LoggerManager::getInstance()->getLogger();
		logger->error(e.getMessage());
	}

	while(!params.isEmpty()) {
		delete params.removeFirst();
	}
	return 0;
}

util::LinkedList<std::string> getParameters(int argc, char **argv) {
	util::LinkedList<std::string> ret;
	for (int i = 0; i < argc; i++) {
		ret.append(new std::string(argv[i+1]));
	}
	return ret;
}

/*
util::Dictionary<std::string, std::string>* getParameters(int argumentsCount, char **userArguments) {
	util::Dictionary<std::string, std::string>* ret = new Dictionary<std::string, std::string> ();
	int length = 5;
	std::string argumentsName[length];
	argumentsName[0] = "originName";
	argumentsName[1] = "originNumber";
	argumentsName[2] = "destinationName";
	argumentsName[3] = "destinationNumber";
	argumentsName[4] = "routeOptimize";
	for (int i = 0; i < argumentsCount; i++) {
		ret->put(argumentsName[i], new std::string(userArguments[i+1]));
	}
	return ret;
}*/
